"""
通过Python编程完成一个银行ATM机模拟系统，具备如下功能:
(1)登陆验证：用户输入用户名密码登陆，检测用户名是否存在以及用户名密码是否匹配；用户名密码共有三次输入机会，超过三次系统退出。
(2)菜单界面：登陆成功后显示功能操作界面，输入序号选择对应功能。
(3)用户注册：用户可以输入用户名和密码创建自己的账号，并输入电话号码等信息，如果用户名存在则让用户重新输入用户名。注册后免费赠送5000元余额。
(4)账户管理：用户可以随时查看自己的账户余额。用户可以输入其他账户用户名，实现转账功能；转账时用户名必须存在，否则提示异常。用户也可以模拟实现存取款功能。
(5)用户名和密码以及账户信息等必须永久保存。且基于命令行完成，不需要开发GUI界面。
"""
from pathlib import Path
import pickle


# ---------------询问返回-------------------
def go_back():
    c = input('是否继续\n1、继续\n2、返回上一层\n3、退出\n请输入选项：')
    if c == '1':
        return True
    elif c == '2':
        return False
    elif c == '3':
        exit()


# ----------------用户类对象------------------
class User:
    def __init__(self, name, passwd, tel, gender='保密', money=5000):
        self.name = name
        self.passwd = passwd
        self.tel = tel
        self.money = money
        self.gender = gender

    def add_money(self, money):
        self.money += money

    def del_money(self, money):
        self.money -= money


# --------------登录---------------
def log_in(info):
    c = 1
    while True:
        name = input('请输入用户名：')
        passwd = input('请输入密码：')
        if name in info:
            passwd1 = pickle.loads(info[name]).passwd
            if passwd1 == passwd:
                print('***************登录成功*************')
                return name
        elif c < 3:
            print('用户名或密码输入有误！')
            c += 1
            w = input('是否继续\n1、继续\n2、返回\n请输入选项：')
            if w == '1':
                continue
            elif w == '2':
                return False
        else:
            print('输入错误次数过多!\n请查证后再登录！')
            exit()


# ------------注册------------
def login(info):
    while True:
        name = input('*请输入用户名：')
        if not name:
            print('必须有用户名！')
            w = input('是否继续\n1、继续\n2、返回\n请输入选项：')
            if w == '1':
                continue
            elif w == '2':
                return info
        if name in info:
            print('用户名', name, '已存在！\n请重新输入！')
            continue
        while True:
            passwd = input('*请输入密码：')
            if passwd:
                break
            else:
                w = input('是否继续\n1、继续\n2、返回\n请输入选项：')
                if w == '1':
                    continue
                elif w == '2':
                    return info
        gender = input('请输入性别：')
        while True:
            tel = input('*请输入联系电话：')
            if tel:
                break
            else:
                w = input('是否继续\n1、继续\n2、返回\n请输入选项：')
                if w == '1':
                    continue
                elif w == '2':
                    return info
        if not gender:
            u = User(name, passwd, tel)
        else:
            u = User(name, passwd, tel, gender)
        # print(u, type(u))
        print('恭喜你，注册成功！\n已赠送您5000元，请注意查收！')
        # ------------对产生的对象进行序列化，与名字组成kv对，存入用户信息的字典
        info[name] = pickle.dumps(u)
        if go_back():
            continue
        else:
            return info


# ------------------进入用户管理界面----------------------
def manu(user_info, sir_name):
    sir_info = pickle.loads(user_info[sir_name])
    base_manu = Path('./manu.txt')
    # --------从文本中读取目录列表
    if base_manu.exists():
        manu_info = base_manu.read_text(encoding='utf8')
        # print(manu_info.format(sir_name))
    else:
        manu_info = """************{:^4}***************
            1、查询余额
            2、存钱
            3、取钱
            4、转账
            5、退出
*********************************"""
        base_manu.write_text(manu_info, encoding='utf8')
    while True:
        print(manu_info.format(sir_name))
        manu_chose = input('请输入选项：')
        if manu_chose == '1':
            # ----------查询余额
            print(sir_info.money, '元')
        elif manu_chose == '2':
            # ---------存钱
            while True:
                money = input('您需要存入多少钱：')
                if money.isdigit():
                    sir_info.add_money(int(money))
                    print('操作成功，已成功存入', money, '元！')
                    user_info[sir_name] = pickle.dumps(sir_info)
                    if go_back():
                        continue
                    else:
                        break
                else:
                    print('输入有误！')
                    if go_back():
                        continue
                    else:
                        break
        elif manu_chose == '3':
            # ----------取钱
            while True:
                money = input('您需要取多少钱：')
                if money.isdigit():
                    money = int(money)
                    if money >= sir_info.money:
                        print('余额不足！')
                        continue
                    sir_info.del_money(money)
                    print('操作成功，已成功取出现金', money, '元！')
                    user_info[sir_name] = pickle.dumps(sir_info)
                    if go_back():
                        continue
                    else:
                        break
                else:
                    print('输入有误！')
                    if go_back():
                        continue
                    else:
                        break
        elif manu_chose == '4':
            # -------------转账
            while True:
                name = input('请输入对方用户的名字：')
                if name not in user_info:
                    print('没有此用户！')
                    if go_back():
                        continue
                    else:
                        break
                while True:
                    money = input('请输入需要转账的金额：')
                    if money.isdigit():
                        money = int(money)
                        if money >= sir_info.money:
                            print('余额不足！')
                            if go_back():
                                continue
                            else:
                                break
                        elif money > 0:
                            sir_info.del_money(money)
                            you_info = pickle.loads(user_info[name])
                            you_info.add_money(money)
                            print('转账成功！')
                            user_info[sir_name] = pickle.dumps(sir_info)
                            user_info[name] = pickle.dumps(you_info)
                            if go_back():
                                continue
                            else:
                                manu(user_info, sir_name)
                                return user_info
        elif manu_chose == '5':
            return user_info
        else:
            print('输入不合法！')
            if go_back():
                continue
            else:
                break


if __name__ == '__main__':
    # --------------读取文本文件-----------------
    user_info = dict()
    base = Path('./user_info.json')
    if base.exists():
        user_info = pickle.loads(base.read_bytes())
        # print(user_info)
    else:
        base.write_bytes(pickle.dumps(user_info))
    base_login = Path('./login_register.txt')
    # -----------从文本中读取登录目录
    if base_login.exists():
        login_info = base_login.read_text(encoding='utf8')
    else:
        login_info = """************ATM系统************
            1、登录
            2、注册
            3、退出
*******************************"""
        base_login.write_text(login_info, encoding='utf8')
    try:
        while True:
            print(login_info)
            login_chose = input('请输入选项：')
            if login_chose == '1':
                # --------------登录
                sir_name = log_in(user_info)
                # ---------------登录失败
                if not sir_name:
                    continue
                # --------------登录成功，进入用户管理界面
                user_info = manu(user_info, sir_name)
            elif login_chose == '2':
                # --------------注册
                user_info = login(user_info)
            elif login_chose == '3':
                exit()
            else:
                print('输入不合法，请重新输入！')
    finally:
        # -----------每次操作过后重新写入
        # print(user_info)
        base.write_bytes(pickle.dumps(user_info))
        # with open(base,'wb')as file:
        #     file.write(pickle.dumps(user_info))

# 完成的很出色，功能逻辑实现的都不错，代码也依然很规范